package com.losalpes.persistence;

import com.losalpes.persistence.entity.Cliente;
import com.losalpes.persistence.entity.CriterioBusqueda;
import com.losalpes.persistence.entity.ItemCompra;
import com.losalpes.persistence.entity.Mueble;
import com.losalpes.persistence.entity.TipoBusqueda;
import com.losalpes.persistence.entity.TipoMueble;
import com.losalpes.persistence.entity.Usuario;
import com.losalpes.persistence.entity.Compra;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * @author Luis Fernando Martinez
 */
@Stateless
public class PersistenceServices implements IPersistenceServices {

    @PersistenceContext
    private EntityManager em;

    public PersistenceServices() {
    }

    public void create(Object obj) {
        em.persist(obj);
    }

    public void update(Object obj) {
        em.merge(obj);
    }

    public void delete(Object obj) {
        em.remove(em.merge(obj));
    }

    public List findAll(Class c) {
        return em.createQuery("select O from " + c.getSimpleName() + " as O").getResultList();
    }

    public Object findById(Class c, Object id) {
        return em.find(c, id);
    }

    public List<Cliente> findClienteByCriterio(CriterioBusqueda criterioBusqueda) {
        String query = "";
        Query jpquery = null;
        System.out.println("criterioBusqueda.getParametroBusqueda = " + criterioBusqueda.getParametroBusqueda());
        System.out.println("criterioBusqueda.getTipoBusqueda() = " + criterioBusqueda.getTipoBusqueda());
        if (criterioBusqueda.getTipoBusqueda().compareTo(TipoBusqueda.DOCUMENTO) == 0) {
            query = "Select c FROM Cliente c WHERE c.numeroDocumento = :documento";
            jpquery = em.createQuery(query);
            jpquery.setParameter("documento", criterioBusqueda.getParametroBusqueda());
        } else if (criterioBusqueda.getTipoBusqueda().compareTo(TipoBusqueda.EMAIL) == 0) {
            query = "Select c FROM Cliente c WHERE c.email = :email";
            jpquery = em.createQuery(query);
            jpquery.setParameter("email", criterioBusqueda.getParametroBusqueda());
        } else if (criterioBusqueda.getTipoBusqueda().compareTo(TipoBusqueda.NOMBRE) == 0) {
            query = "Select c FROM Cliente c WHERE c.nombre = :nombre";
            jpquery = em.createQuery(query);
            jpquery.setParameter("nombre", criterioBusqueda.getParametroBusqueda());
        }
        List<Cliente> listaClientes = jpquery.getResultList();
        System.out.println("cliente " + listaClientes.size());
        return listaClientes;
    }

    public Usuario autenticarUsuario(String usuario, String pwd) {
        Query cons = em.createNamedQuery("autenticar");
        cons.setParameter("usuario", usuario);
        cons.setParameter("pwd", pwd);
        List<Usuario> lista = cons.getResultList();
        if(lista == null || lista.size()==0){
            return null;
        }else{
            return lista.get(0);
        }
    }

    
    public Cliente findClienteByUsuario(Usuario usuario){
        Query cons = em.createNamedQuery("Cliente.findByUsuario");
        cons.setParameter("usuario", usuario);
        Cliente res = (Cliente) cons.getSingleResult();
        return res;
    }

    public List<Mueble> findMuebleByType(TipoMueble tipoMueble) {
        Query cons = em.createNamedQuery("Mueble.findByType");
        cons.setParameter("tipo", tipoMueble);
        List<Mueble> lista = cons.getResultList();
        return lista;
    }

    public List<Compra> ventasProductoReporte(Date fecha1, Date fecha2){
        Query jpquery = null;
       // String sql = "SELECT p FROM Compra p WHERE p.fecha > :fecha1 AND p.fecha < :fecha2 ";
       
        //jpquery = em.createQuery(sql);
        //jpquery.setMaxResults(10);
        //List<Compra> ventasProducto = jpquery.getResultList(); //String sql = "SELECT i.mueble, COUNT(i.id) FROM Compra c JOIN c.ItemCompra i "+
        //             "GROUP BY i.mueble HAVING COUNT(i.id) > 5 ";


        return null;
    }

    public List<Compra> ventasClienteReporte(Date fecha1, Date fecha2, String cliente){
        Query jpquery = null;
        String sql = "SELECT p FROM Compra p WHERE p.fecha > :fecha1 AND p.fecha < :fecha2 ";
        jpquery = em.createQuery(sql);
        jpquery.setParameter("fecha1", fecha1);
        jpquery.setParameter("fecha2", fecha2);
        List<Compra> listaCompra = jpquery.getResultList();

        return listaCompra;
    }

    public List<ItemCompra> ventasDiaReporte(Date fecha1, Date fecha2, String ciudad){
        Query jpquery = null;
        String sql = "SELECT i FROM ItemCompra i ";
        //String sql = "SELECT i FROM Compra c INNER JOIN c.ItemCompra i "+
                     //"WHERE c.fecha > :fecha1 AND c.fecha < :fecha2)";

        jpquery = em.createQuery(sql);
        //jpquery.setParameter("fecha1", fecha1);
        //jpquery.setParameter("fecha2", fecha2);
        List<ItemCompra> listaCompra = jpquery.getResultList();

        return listaCompra;
    }

    public List productoMasVendido(){
        Query jpquery = null;
        //String sql = "select sum(i.cantidad),i.mueble.referencia from Compra c join c.ItemCompra i group by i.mueble.referencia";
        String sql = "select sum(i.cantidad),i.mueble.referencia from ItemCompra i group by i.mueble.referencia";
        //String sql = "SELECT i FROM Compra c INNER JOIN c.ItemCompra i "+
                     //"WHERE c.fecha > :fecha1 AND c.fecha < :fecha2)";

        jpquery = em.createQuery(sql);
        List lista = jpquery.getResultList();
        if(lista.size()==0){
            System.out.println("Error ****************** =  Longitud o" );
        }else{

            System.out.println("Trajo algo +++++++++ " +  lista.size() );
            System.out.println("Lista    " + lista.get(0).toString());
            for(int i = 0 ; i<lista.size();i++){
                Object[] res = (Object[]) lista.get(i);
                System.out.println("res[0] = " + res[0]);
                System.out.println("res[1] = " + res[1]);
            }
        }
        return lista;
    }

}
